home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 2002 November / SGI Freeware 2002 November - Disc 2.iso / dist / fw_glimpse.idb / usr / freeware / src / glimpse-3.0 / index / glimpse.h.z / glimpse.h
C/C++ Source or Header  |  1997-09-09  |  12KB  |  274 lines

  1. /* Copyright (c) 1994 Sun Wu, Udi Manber, Burra Gopal.  All Rights Reserved. */
  2. /* ./glimpse/index/pirs.h */
  3. #ifndef _GLIMPSE_H_
  4. #define _GLIMPSE_H_
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include <sys/types.h>
  9. /*#include <sys/uio.h>*/
  10. #include <sys/types.h>
  11. #include <sys/stat.h>
  12. #include <unistd.h>
  13. #include <fcntl.h>
  14. #undef log
  15. #include "agrep.h"
  16.  
  17. #ifndef S_ISREG
  18. /* #define S_ISREG(mode) (0100000&(mode)) */
  19. #define S_ISREG(mode)   (((mode) & (_S_IFMT)) == (_S_IFREG))
  20. #endif
  21.  
  22. #ifndef S_ISDIR
  23. /* #define S_ISDIR(mode) (0040000&(mode)) */
  24. #define S_ISDIR(mode)   (((mode) & (_S_IFMT)) == (_S_IFDIR))
  25. #endif
  26.  
  27. #define IC_PORTRELEASE    20    /* time till used TCP port is released */
  28. #ifndef ON
  29. #define ON        1
  30. #endif
  31. #ifndef OFF
  32. #define OFF        0
  33. #endif
  34. #ifndef CHAR
  35. #define CHAR         unsigned char
  36. #endif
  37. #define MAX_INCLUSIVE    256    /* max number of inclusive patterns for
  38.                    files to be indexed even if filetype.c
  39.                    says otherwise. */
  40. #define MAX_EXCLUSIVE    256     /* max number of exclusive patterns 
  41.                    for not_to_be_indexed files  */
  42. #define MAX_FILTER    256    /* max number of filter patterns */
  43. #define DEF_I_THRESHOLD    40000    /* 100000 originally, debugging 10000 */
  44. #define AVG_OCCURRENCES    8    /* #of places a word occurs on average: sizeof(.glimpse_partitions)/`wc -l .glimpse_index`: divisible by INDEX_SET_SIZE */
  45. #define MAX_LIST    0177777
  46. #define DEFAULT_PART_SIZE (1 << 13)
  47. #define MAX_64K_HASH    (64*1024)
  48. #define MAX_256K_HASH    (256*1024)
  49. #define MAX_4K_HASH    (4*1024)
  50.  
  51. #define DISKBLOCKSIZE    8192
  52. #define BLOCK_SIZE    (1024*64)
  53. #define MAX_PARTITION    255
  54. #define MaxNumPartition    250     /* it's not 255, since there is fragmentation*/
  55.  
  56. /* The idea behind our encoding is: dividend = divisor * quotient + remainder */
  57. #define MaxNum4bPartition (16 -  2)    /* since 10 and 0 can't be in LSB/MSB */
  58. #define MaxNum8bPartition (256 - 2)
  59. #define MaxNum12bPartition (MaxNum4bPartition*MaxNum8bPartition)
  60. #define MaxNum16bPartition (MaxNum8bPartition*MaxNum8bPartition)
  61. #define MaxNum24bPartition (MaxNum8bPartition*MaxNum16bPartition)
  62. #define MaxNum32bPartition (MaxNum8bPartition*MaxNum24bPartition)
  63.  
  64. /* These help in encoding byte-level indices: 1st byte's top 2 bits tell the #of bytes - 1 in offset-difference encoding; offset-diff 0 => new file follows */
  65. #define MaxNum1BPartition (MaxNum8bPartition & 0x3f)            /* 62: top byte is 0x00 | x % MaxNum8bPartition === x; just encode x */
  66. #define MaxNum2BPartition (MaxNum1BPartition * MaxNum8bPartition)    /* top byte = 0x40 | x / MaxNum8bPartition; rest is x % ~; encode both separately */
  67. #define MaxNum3BPartition (MaxNum1BPartition * MaxNum16bPartition)    /* top byte = 0x80 | x / MaxNum16bPartition; rest is x % ~; encode both separately */
  68. #define MaxNum4BPartition (MaxNum1BPartition * MaxNum24bPartition)    /* top byte = 0xc0 | x / MaxNum24bPartition; rest is x % ~; encode both separately */
  69.  
  70. #define MIN_WORDS        50    /* before we inform about numeric words */
  71. #define MAX_SEARCH_PERCENT    20    /* warn user if searching > this % of blocks */
  72. #define DEF_MAX_INDEX_PERCENT    80    /* if word in > 80%, say everywhere for one-file-per-block */
  73. #define DONT_CONFUSE_SORT 1
  74. #define WORD_END_MARK     2
  75. #define ALL_INDEX_MARK    3        /* If this, then word is in > 60% of blocks */
  76. #define ATTR_END_MARK    4        /* After list of attributes before file offset/block numbers */
  77.  
  78. #define AVG_WORD_LEN    12        /* average word length is 8-9 including '\0': have safety margin */
  79. #define MAX_NAME_SIZE   256
  80. #define MAX_NAME_LEN    MAX_NAME_SIZE
  81. #define MaxNameLength    MAX_NAME_SIZE
  82. #define MAX_LINE_SIZE    1024
  83. #define MAX_LINE_LEN    1024
  84. #define MAX_SORTLINE_LEN (MAX_LINE_LEN * 16)    /* Can be ((MaxNum16bPartition*sizeof(int)+MAX_NAME_LEN)*MAX_INDEX_PERCENT/100) in the worst case */
  85. #define MAX_NAME_BUF    MAX_NAME_SIZE
  86. #define MAX_WORD_SIZE    64    /* w/o '\0'; was 24 in 2.1 */
  87. #define MAX_WORD_LEN    MAX_WORD_SIZE
  88. #define MAX_WORD_BUF    80    /* was 32 in 2.1 */
  89. #define MAX_PAT        256  
  90. #define MAXNUM_INDIRECT    MaxNum8bPartition
  91. #define MAX_INDEX_BUF    (MAX_PARTITION + 1 + 2*MAX_WORD_BUF + 2)    /* index line length without OneFilePerBlock */
  92. #define DEF_REAL_INDEX_BUF    (MaxNum16bPartition  + 2*MAX_WORD_BUF + 2)    /* index line length with OneFilePerBlock */
  93.  
  94. /* Must write fresh code to calculate these sets based by multiplying defaults below with round(file_num, MaxNum16bPartition) */
  95. #define DEF_FILESET_SIZE    MaxNum16bPartition    /* used when OneFilePerBlock is ON */
  96. #define DEF_FILEMASK_SIZE    (DEF_FILESET_SIZE/(8*sizeof(int)) + 4)    /* bit mask of files */
  97. #define DEF_REAL_PARTITION    (DEF_FILEMASK_SIZE + 4)    /* must be > MAX_PARTITION + 1 */
  98. /* block must be in 0..DEF_FILESET_SIZE-1, and integers should represent bit-masks */
  99. #define block2index(i)    (i/(8*sizeof(int)))
  100. #define block2mask(i)    (1<<(i%(8*sizeof(int))))    /* not used */
  101. #define round(x, y)    (((x)+(y)-1)/(y))
  102. #define FILES_PER_PARTITION(x)    (16 + round(x, MAX_PARTITION)*4)    /* 16 is minimum length of buffer: thereafter, allow noise upto 4 times average */
  103.  
  104. #define LIST_GET(list, elem) ((list[(elem)/MaxNum16bPartition] == 0) ? (0) : (list[(elem)/MaxNum16bPartition][(elem)%MaxNum16bPartition]))
  105. #define LIST_SUREGET(list, elem) (list[(elem)/MaxNum16bPartition][(elem)%MaxNum16bPartition])
  106.  
  107. #define LIST_ADD(list, elem, what, type) \
  108. {\
  109.     int    index = (elem + 1)/MaxNum16bPartition;\
  110.     if (list[index] == NULL) {\
  111.         list[index] = (type *)malloc(sizeof(type)*MaxNum16bPartition);\
  112.         memset(list[index], '\0', sizeof(type)*MaxNum16bPartition);\
  113.     }\
  114.     LIST_SUREGET(list, elem) = what;\
  115. }
  116.  
  117. #define DEFAULT_REGION_LIMIT 256    /* default limit for a record: for ByteLevelIndex: pattern is ignored since can't avoid false matches w/o search */
  118. #define MAX_REGION_LIMIT 16384    /* max amount of space I am going allocate for a record bounded by a delimiter */
  119. #define MAX_PER_LINE    (MAX_SORTLINE_LEN / 2)    /* #of words that can occur on one line before we split it up: not implemented at present */
  120. #define DEF_MAX_PER_MB    500    /* Maximum number of times a word should occur in a megabyte before we say its everywhere */
  121. #define DEF_ALL_INDEX    10000    /* Must be < DEF_MAX_ALL_INDEX */
  122. #define DEF_MAX_ALL_INDEX    (DEF_REAL_INDEX_BUF / 2)    /* THIS * 2 must be < DEF_REAL_INDEX_BUF to prevent seg-faults! */
  123.  
  124. /* Default file names */
  125. #define FILTER_FILE    ".glimpse_filters"
  126. #define ATTRIBUTE_FILE    ".glimpse_attributes"
  127. #define INDEX_FILE    ".glimpse_index"
  128. #define MINI_FILE    ".glimpse_turbo"
  129. #define P_TABLE        ".glimpse_partitions"
  130. #define NAME_LIST    ".glimpse_filenames"
  131. #define NAME_LIST_INDEX    ".glimpse_filenames_index"
  132. #define NAME_HASH    ".glimpse_filehash"
  133. #define NAME_HASH_INDEX    ".glimpse_filehash_index"
  134. #define DEF_LOG_FILE    ".glimpse_log"
  135. #define DEF_MESSAGE_FILE ".glimpse_messages"
  136. #define DEF_STAT_FILE    ".glimpse_statistics"
  137. #define PROHIBIT_LIST    ".glimpse_exclude"
  138. #define INCLUDE_LIST    ".glimpse_include"
  139. #define DEBUG_FILE    ".glimpse_debug"
  140. #define I2        ".glimpse_tmpi2"
  141. #define I3        ".glimpse_tmpi3"
  142. #define I1        ".glimpse_tmpi1"
  143. #define O1        ".glimpse_tmpo1"
  144. #define O2        ".glimpse_tmpo2"
  145. #define O3        ".glimpse_tmpo3"
  146. #define DEF_LOCK_FILE    ".glimpse_lock"
  147. #define HARVEST_PREFIX    "glimpse"    /* so that Darren can filterout error messages a user should see from the stuff outputted by glimpse on an error */
  148.  
  149. #define MASK_INT \
  150. { 0x00000001, 0x00000002, 0x00000004, 0x00000008, 0x00000010, 0x00000020, 0x00000040, 0x00000080,\
  151.   0x00000100, 0x00000200, 0x00000400, 0x00000800, 0x00001000, 0x00002000, 0x00004000, 0x00008000,\
  152.   0x00010000, 0x00020000, 0x00040000, 0x00080000, 0x00100000, 0x00200000, 0x00400000, 0x00800000,\
  153.   0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000, 0x20000000, 0x40000000, 0x80000000\
  154. }
  155.  
  156. #define INDEXABLE(c)    (indexable_char[c])
  157.  
  158. #if    SFS_COMPAT
  159. #define IGNORED_SUFFIXES {"gz", "Z", "z", "zip", "o", "hqx", "tar", "glimpse_index", "glimpse_partitions", "glimpse_filenames", "glimpse_filenames.prev", "glimpse_statistics", "glimpse_messages", "glimpse_exclude", "glimpse_include", "glimpse_filters", "glimpse_attributes"}
  160. #define NUM_SUFFIXES    17
  161. #else
  162. #define IGNORED_SUFFIXES {"gz", "Z", "z", "zip", "o", "hqx", "tar", "glimpse_index", "glimpse_partitions"}
  163. #define NUM_SUFFIXES    9
  164. #endif
  165.  
  166. /* Version and release year: same for glimpse and glimspeindex since glimpse HAS to interpret glimpseindex */
  167. #define GLIMPSE_VERSION    "3.0"
  168. #define GLIMPSE_DATE    "1995"
  169. #define GLIMPSE_EMAIL    "glimpse@cs.arizona.edu"
  170.  
  171. /* Some extern functions used in structured queries */
  172. extern int attr_name_to_id(), attr_load_names(), attr_dump_names();
  173. extern char *attr_id_to_name();
  174.  
  175. /* Data structures for hash-tables in build_in.c */
  176. struct  token {            /* each token stores a unique word and unique attribute */    
  177.         struct token *next_t;    /* keep it a pointer even with tokenalloc to keep build_in.c same */
  178.     char *word;             
  179.     struct indices *ip;    /* points to the head of the list of indices */
  180.     struct indices *lastip;    /* tail of this list = last elemet (for increasing order insertion) */
  181.     unsigned int attribute;
  182.     unsigned int totalcount;/* no. of indices structures in a token */
  183.         };
  184.  
  185. #define INDEX_SET_SIZE    4
  186. #define INDEX_ELEM_FREE    (MaxNum24bPartition + 1)    /* can never be equal to a partition value */
  187.  
  188. struct indices {
  189.     struct indices *next_i;    /* keep it a pointer even with indexalloc to keep build_in.c same */
  190.         /*unsigned*/ int index[INDEX_SET_SIZE];     /* changed from char, 31/3/94 */
  191.     /*unsigned*/ int offset[INDEX_SET_SIZE];    /* added 19/9/94 */
  192.     };
  193.  
  194. /* Added 20/9/94 for get_index.c in glimpse (make it more efficient in space later) */
  195. struct offsets {
  196.     struct offsets *next;
  197.     int offset;    /* NOT unsigned!!! */
  198.     short    sign;    /* if 0, then indeterminate (bothways), 1 then +ve, -1 then -ve */
  199.     short    done;    /* if 0, then this did not have an intersection now, else it has had it */
  200.     };
  201.  
  202. #define INDICES_PER_TOKEN    (AVG_OCCURRENCES/INDEX_SET_SIZE)    /* average no. of struct indices per struct token: purely empirical result :-) */
  203.  
  204. /* Memory allocators: in io.c */
  205. extern char *my_malloc();
  206. extern int my_free();
  207. extern char *wordalloc();
  208. extern int wordfree();
  209. extern int allwordfree();
  210. extern struct indices *indicesalloc();
  211. extern int indicesfree();
  212. extern int allindicesfree();
  213. extern struct token *tokenalloc();
  214. extern int tokenfree();
  215. extern int alltokenfree();
  216.  
  217. #define LIMIT_64K_HASH    50    /* size of total stuff to be indexed in MB after which 256K hash tables make more sense with the -B option */
  218. #define hashword(word, wordlen)    (((total_size < LIMIT_64K_HASH*1024*1024) || !BigHashTable) ? (hash64k(word, wordlen)) : (hash256k(word, wordlen)));
  219.  
  220. /*
  221.  * Just stores the word, wordlength and offset present in a line of the index in a structure (when made with -o or -b).
  222.  * Doesn't store the attribute since we just need a hint into .glimpse_index from where agrep should begin search.
  223.  */
  224. #define    WORD_SORTED    0
  225.  
  226. #if    WORD_SORTED
  227. struct mini {
  228.     char    *word;
  229.     long    offset;
  230. };
  231.  
  232. /* Region searched with strcmp. #of regions = mini_array_len = (`wc -l .glimpse_index` - 3) / WORDS_PER_REGION */
  233. #define WORDS_PER_REGION    128
  234. #else    /* WORD_SORTED */
  235. struct mini {
  236.     long    offset;
  237. };
  238.  
  239. /* Range of each mini_array entry is words with same hash32k value => 32K offsets into the index need to be stored */
  240. #define MINI_ARRAY_LEN        (64*1024)
  241. #endif    /* WORD_SORTED */
  242.  
  243. /* For incremental indexing only */
  244. typedef struct _name_hashelement {
  245.     struct _name_hashelement *next;
  246.     char    *name;
  247.     int    name_len;
  248.     int    index;
  249. } name_hashelement;
  250.  
  251. /*
  252.  * Limit on number of files is MaxNum24bPartition. To change it, you need
  253.  * to add encode/decode code everywhere, INDEX_ELEM_FREE and MAXNUM_INDIRECT.
  254.  *
  255.  * Limit on number of attributes is MaxNum16bPartition. To change it, you
  256.  * need to add encode/decode code everywhere. That is: merge_splits(),
  257.  * save_data_structures(), traverse(), merge_in() and scanword()
  258.  * in glimpseindex; get_set() in glimpse; and printx.c.
  259.  *
  260.  * No need to change any other data structures.
  261.  */
  262.  
  263. /* Names of various system commands used in glimpseindex: use mv/rm etc rather than rename()/unlink() since former don't return unless parent-dir is sync-ed */
  264. #define SYSTEM_SORT    "sort"    /* replace with different sort with longer lines. Later write a procedure for sort that doesn't need system() */
  265. #define SYSTEM_LS    "ls"
  266. #define SYSTEM_MV    "mv"    /* this doesn't work with SFS */
  267. #define SYSTEM_RM    "rm"    /* this doesn't work with SFS */
  268. #define SYSTEM_CAT    "cat"
  269. #define SYSTEM_HEAD    "head"
  270. #define SYSTEM_CP    "cp"
  271. #define SYSTEM_ECHO    "echo"
  272. #define SYSTEM_WC    "wc"
  273. #endif /* _GLIMPSE_H_ */
  274.